package org.zjx.core.nodes;

import lombok.Getter;
import org.zjx.core.DecisionContext;
import org.zjx.core.DecisionNode;
import org.zjx.core.GameAction;

import java.util.List;

/**
 * 顺序执行节点
 *
 * 按顺序依次执行子节点，一旦某个节点返回非null结果，
 * 立即停止执行后续节点并返回该结果。
 */
@Getter
public class SequenceNode implements DecisionNode {
    // 子节点列表，使用不可变集合保证线程安全
    private final List<DecisionNode> nodes;

    /**
     * 构造函数(使用List参数)
     *
     * @param nodes 子节点列表
     */
    public SequenceNode(List<DecisionNode> nodes) {
        // 创建子节点列表的不可变副本，保证线程安全
        this.nodes = List.copyOf(nodes);
    }

    /**
     * 构造函数(使用可变参数)
     *
     * @param nodes 子节点(可变参数形式)
     */
    public SequenceNode(DecisionNode... nodes) {
        // 将可变参数转换为List，再创建不可变副本
        this(List.of(nodes));
    }

    /**
     * 执行决策逻辑(顺序版本)
     *
     * @param context 决策上下文
     * @return 第一个返回非null结果的子节点结果，如果没有则返回null
     *
     * 执行流程：
     * 1. 按顺序遍历所有子节点
     * 2. 对每个子节点调用decide方法
     * 3. 如果子节点返回非null结果，立即返回该结果
     * 4. 如果所有子节点都返回null，最终返回null
     *
     * 特点：
     * 1. 短路评估(short-circuit evaluation)提高效率
     * 2. 保持决策上下文状态的一致性
     */
    @Override
    public GameAction decide(DecisionContext context) {
        // 遍历所有子节点
        for (DecisionNode node : nodes) {
            // 调用当前节点的决策方法
            GameAction action = node.decide(context);
            // 如果返回非null结果，立即返回
            if (action != null) {
                return action;
            }
        }
        // 所有子节点都返回null
        return null;
    }
}